package com.zzzptc.lzh.bookreader.Utils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;

public class ProcessText {
    //int，16位，上限-30000到30000 long，32位，是负亿到亿
    public long pages;//总页数
    public final int SIZE=3000;//每一页的字节数，字节数固定
    public long bytescount;//字节总数
    public long currentpage;//当前页数
    public RandomAccessFile readFile;

    //构造方法，传入当前页，为了实现书签的功能，记录用户读取的文章位置
    public ProcessText(File file,long currentpage){
        try {
            readFile=new RandomAccessFile(file,"r");//r读取，w写
            bytescount=readFile.length();//获取字节总数
            pages=bytescount/SIZE;//计算得出文本的页数
            this.currentpage=currentpage;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //定位字节位置，根据页数定位文本的位置
    private void seek(long page){
        try {
            readFile.seek(page*SIZE);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //固定读取 SIZE+16个字节的内容，这就是为什么+16
    //读取的字节 需要进行转码 转码不可能刚好就是文本内容，
    //一页的末尾和开始的
    private String read() {
        //内容重叠防止末尾字节乱码
        byte[] buffer = new byte[SIZE+16];//字节显示不完整�
        try {
            readFile.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String str = new String(buffer, Charset.forName("utf-8"));
        str=str.replace("�","");//文字变成�，解决�的问题，将�直接用空代替
        return str;
    }
    //上一页功能的实现
    public String getPre(){
        String content=null;
        //第一页的情况 定位在0字节 读取内容 当前页数不改变
        if (currentpage<=1){
            seek(0);
            content=read();
            currentpage=1;
        }else{
            //其它页 则定位到当前页-2处 在读取指定字节内容 例如当前当前定位到第二页的末尾2+SIZE 上一页应该是第一页
            seek(currentpage-2);
            content=read();
            currentpage--;
        }
        return content;
    }
    //下一页功能的实现
    public String getNext(){
        String content=null;
        if (currentpage>=pages){//当前页为最后一页的时候，显示的还是最后一页
            currentpage=pages;
            seek(currentpage);
            content=read();
        }else{
            seek(currentpage);
            content=read();
            currentpage++;
        }
        return content;
    }
}
